/**
 * Store辅助工具类
 * 提供通用Store操作方法
 */
class StoreHelper {
  /**
   * 创建分页状态
   * @param {Number} page 当前页码
   * @param {Number} size 每页数量
   * @param {Number} total 总数量
   * @returns {Object} 分页状态对象
   */
  static createPagination(page = 1, size = 20, total = 0) {
    return {
      page,
      size,
      total,
      hasMore: total > page * size
    };
  }
  
  /**
   * 合并分页数据
   * @param {Array} existingData 现有数据
   * @param {Array} newData 新数据
   * @param {Object} pagination 分页信息
   * @param {Boolean} isAppend 是否追加模式
   * @returns {Array} 合并后的数据
   */
  static mergePaginatedData(existingData, newData, pagination, isAppend = false) {
    if (!isAppend) {
      return newData || [];
    }
    
    return [...existingData, ...(newData || [])];
  }
  
  /**
   * 根据ID更新指定项目
   * @param {Array} list 数据列表
   * @param {String} id 项目ID
   * @param {Object|Function} updater 更新对象或函数
   * @returns {Array} 更新后的列表
   */
  static updateItemById(list, id, updater) {
    if (!Array.isArray(list) || !id) return list;
    
    return list.map(item => {
      if (item._id === id || item.id === id) {
        if (typeof updater === 'function') {
          return updater(item);
        }
        return { ...item, ...updater };
      }
      return item;
    });
  }
  
  /**
   * 从列表中删除指定ID的项目
   * @param {Array} list 数据列表
   * @param {String} id 项目ID
   * @returns {Array} 更新后的列表
   */
  static removeItemById(list, id) {
    if (!Array.isArray(list) || !id) return list;
    
    return list.filter(item => item._id !== id && item.id !== id);
  }
  
  /**
   * 添加项目到列表
   * @param {Array} list 数据列表
   * @param {Object} item 新项目
   * @param {String} position 添加位置 'start'|'end'
   * @returns {Array} 更新后的列表
   */
  static addItem(list, item, position = 'start') {
    if (!Array.isArray(list)) return [item];
    
    return position === 'start' ? [item, ...list] : [...list, item];
  }
  
  /**
   * 过滤列表
   * @param {Array} list 数据列表
   * @param {Function} predicate 过滤条件
   * @returns {Array} 过滤后的列表
   */
  static filterList(list, predicate) {
    if (!Array.isArray(list) || typeof predicate !== 'function') {
      return list;
    }
    
    return list.filter(predicate);
  }
  
  /**
   * 按字段排序列表
   * @param {Array} list 数据列表
   * @param {String} field 排序字段
   * @param {Boolean} ascending 是否升序
   * @returns {Array} 排序后的列表
   */
  static sortList(list, field, ascending = true) {
    if (!Array.isArray(list) || !field) return list;
    
    return [...list].sort((a, b) => {
      const valueA = a[field];
      const valueB = b[field];
      
      if (valueA === valueB) return 0;
      
      if (valueA > valueB) {
        return ascending ? 1 : -1;
      } else {
        return ascending ? -1 : 1;
      }
    });
  }
  
  /**
   * 格式化错误消息
   * @param {Error|String} error 错误对象或消息
   * @param {String} defaultMsg 默认消息
   * @returns {String} 格式化后的错误消息
   */
  static formatError(error, defaultMsg = '操作失败') {
    if (!error) return defaultMsg;
    
    if (typeof error === 'string') return error;
    
    return error.message || error.errMsg || defaultMsg;
  }
}

export default StoreHelper; 